// #include "EventLoop.hpp"
// #include "Socket.hpp"
// #include "Connection.hpp"
// #include "Log.hpp"
// #include "Acceptor.hpp"

// void HandleClose(Channel *channel)
// {
//     DBG_LOG("close fd:%d", channel->Fd());
//     channel->Remove();
//     delete channel;
// }

// void HandleRead(Channel *channel)
// {
//     std::cout << "run into handleread function" << std::endl;
//     int fd = channel->Fd();
//     char buf[128] = {0};
//     int ret = recv(fd, buf, 127, 0);
//     if(ret <= 0)
//     {
//         std::cout << "recv fail" << std::endl;
//         HandleClose(channel);
//         return;
//     }
//     DBG_LOG("%s", buf);
//     channel->EnableWrite(); //启动可写事件
// }
// void HandleWrite(Channel* channel)
// {
//     int fd = channel->Fd();
//     std::string data = "hello world";
//     int ret = send(fd, data.c_str(), data.size() - 1, 0);
//     if(ret < 0)
//     {
//         HandleClose(channel);
//         return;
//     }
//     channel->DisableWrite(); //关闭写监控
// }

// void HandleError(Channel* channel)
// {
//     HandleClose(channel);
// }
// void HandleEvent(EventLoop *loop, Channel *channel, uint64_t timerid)
// {
//     loop->TimerRefresh(timerid);
// }



// //管理所有的连接对象
// std::unordered_map<uint64_t, PtrConnection> _conns;
// uint64_t conn_id = 0;

// void ConnectionDestory(const PtrConnection &conn)
// {
//     _conns.erase(conn->ConnectionId());
// }

// void OnConnected(const PtrConnection &conn)
// {
//     DBG_LOG("new connection %p", conn.get());
// }

// void OnMessage(const PtrConnection &conn, Buffer *buf)
// {
//     DBG_LOG("%s", buf->ReadPosition());
//     buf->MoveReadOffset(buf->ReadAbleSize());

//     std::string str = "hello world";
//     conn->Send(const_cast<char*>(str.c_str()), str.size());
// }

// EventLoop loop;

// //获取新连接，创建Channel
// void NewConnection(int fd)
// {
//     conn_id++;
//     PtrConnection conn(new Connection(&loop, conn_id, fd));
//     conn->SetMessageCallback(std::bind(OnMessage, std::placeholders::_1, std::placeholders::_2));  
//     conn->SetCloseCallback(std::bind(ConnectionDestory, std::placeholders::_1));  
//     conn->SetConnectionCallback(std::bind(OnConnected, std::placeholders::_1));  
//     conn->EnableInactiveRelease(10); //启动超时销毁功能
//     conn->Established();  //就绪初始化

//     _conns.insert(std::make_pair(conn_id, conn));
// }

// int main()
// {
//     srand(time(nullptr));
//     Acceptor acceptor(&loop, 8082);
//     acceptor.SetAcceptCallBack(std::bind(NewConnection, std::placeholders::_1));
//     while(1)
//     {
//         loop.Start();   
//     }
//     return 0;
// }

#include "TcpServer.hpp"

void OnConnected(const PtrConnection &conn)
{
    DBG_LOG("new connection %p", conn.get());
}

void OnClosed(const PtrConnection &conn)
{
    DBG_LOG("close connection %p", conn.get());
}

void OnMessage(const PtrConnection &conn, Buffer *buf)
{
    DBG_LOG("%s", buf->ReadPosition());
    buf->MoveReadOffset(buf->ReadAbleSize());

    std::string str = "hello world";
    conn->Send(const_cast<char*>(str.c_str()), str.size());
    conn->CloseConnection();
}

int main()
{
    TcpServer server(8082);
    server.SetThreadCount(2);
    server.EnableInactiveRelease(10);
    
    server.SetConnectionCallback(OnConnected);
    server.SetCloseCallback(OnClosed);
    server.SetMessageCallback(OnMessage);

    server.Start();
}